Skip to content

Conversation

@anahatAWS
Copy link
Contributor

@anahatAWS anahatAWS commented Aug 14, 2025

Description of changes:

Merges changes from mainline to v2.11.3
Namely: #1111 #1115 #1113 #1117 and #1120

Steps followed:

  1. Fork aws-otel-java-instrumentation repo
  2. Checkout release/2.11.x
  3. Create branch release/2.11.3 based off release/2.11.x (git checkout -b release/2.11.3)
  4. git cherry-pick 572215e ac3c0c7 9a76dda 8a3b772 25b2cd8
  5. Resolved merge conflict for 25b2cd8
  6. run ./gradlew dependencyUpdates
  7. Create PR
The following dependencies are using the latest release version:
 - com.sparkjava:spark-core:2.9.4
 - io.opentelemetry:opentelemetry-extension-aws:1.20.1

The following dependencies have later release versions:
 - com.amazonaws:aws-java-sdk-bom [1.12.599 -> 1.12.788]
     https://aws.amazon.com/sdkforjava
 - com.fasterxml.jackson:jackson-bom [2.16.0 -> 2.19.2]
     https://github.com/FasterXML/jackson-bom
 - com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin [0.50.0 -> 0.52.0]
 - com.google.guava:guava-bom [33.0.0-jre -> 33.4.8-jre]
     https://github.com/google/guava
 - com.google.protobuf:protobuf-bom [3.25.1 -> 4.31.1]
     https://developers.google.com/protocol-buffers/
 - com.linecorp.armeria:armeria-bom [1.26.4 -> 1.33.1]
     https://armeria.dev/
 - com.squareup.okhttp3:okhttp [4.12.0 -> 5.1.0]
     https://square.github.io/okhttp/
 - commons-logging:commons-logging [1.2 -> 1.3.5]
     https://commons.apache.org/proper/commons-logging/
 - io.grpc:grpc-bom [1.59.1 -> 1.74.0]
     https://github.com/grpc/grpc-java
 - io.opentelemetry.contrib:opentelemetry-aws-resources [1.39.0-alpha -> 1.48.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.contrib:opentelemetry-aws-xray [1.39.0-adot1 -> 1.48.0]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha [2.11.0-alpha -> 2.18.1-alpha]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.javaagent:opentelemetry-javaagent [2.11.0 -> 2.18.1]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.proto:opentelemetry-proto [1.0.0-alpha -> 1.7.0-alpha]
     https://github.com/open-telemetry/opentelemetry-proto-java
 - net.bytebuddy:byte-buddy [1.14.10 -> 1.17.6]
     https://bytebuddy.net
 - org.apache.logging.log4j:log4j-bom [2.21.1 -> 2.25.1]
     https://logging.apache.org/log4j/2.x/
 - org.assertj:assertj-core [3.24.2 -> 3.27.4]
     https://assertj.github.io/doc/#assertj-core
 - org.curioswitch.curiostack:protobuf-jackson [2.2.0 -> 2.8.1]
     https://github.com/curioswitch/protobuf-jackson
 - org.junit:junit-bom [5.10.1 -> 5.13.4]
     https://junit.org/
 - org.slf4j:slf4j-api [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.slf4j:slf4j-simple [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.springframework.boot:spring-boot-dependencies [2.7.17 -> 3.5.4]
     https://spring.io/projects/spring-boot
 - org.testcontainers:testcontainers-bom [1.19.3 -> 1.21.3]
     https://java.testcontainers.org
 - software.amazon.awssdk:bom [2.30.17 -> 2.32.22]
     https://aws.amazon.com/sdkforjava

Gradle release-candidate updates:
 - Gradle: [8.10 -> 9.0.0 -> 9.1.0-rc-1]

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

anahatAWS and others added 5 commits August 14, 2025 09:27
Note: this is not the complete SPI implementation 

### Issue
The current ADOT Java SDK implementation relies on a combination of
OpenTelemetry SPI and Git patches to extend the OTel SDK functionality.
This approach presents several challenges:

- Reduced modularity and maintainability
- Increased risk of errors during OTel SDK version upgrades
- Manual intervention required for patch management
- Limited ecosystem compatibility with upstream OpenTelemetry
- Difficulty in extending functionality for users

This is the skeleton set up for the SPI, which aims to remove the
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)
for aws-sdk v2.2 by using OTel's InstrumentationModule SPI extension.
This instrumentation is essentially complementing the upstream java
agent. It is completely separate from upstream and instruments after the
Otel agent.

### Description of Changes
This PR sets up the foundational structure for AWS SDK v2.2
Instrumentation, moving away from the current patching approach. It
doesn't modify current ADOT functionality or the upstream span. It just
registers the ADOT SPI implementation and sets up the interceptor hooks.

#### Core Components

1. **AdotAwsSdkInstrumentationModule**
   - Extends OpenTelemetry's `InstrumentationModule` SPI
   - Registers custom interceptors in specific order:
     1. Upstream AWS SDK execution interceptor
     2. ADOT custom interceptor
- Ensures proper instrumentation sequencing through careful resource
registration

2. **AdotTracingExecutionInterceptor**
   - Extends AWS SDK's `ExecutionInterceptor`
   - Hooks into key SDK lifecycle points:
- `beforeTransmission`: Captures final SDK request after upstream
modifications
- `modifyResponse`: Processes response before span closure in upstream
   - Will be used to enriches spans
   - Acts as central coordinator for all the awssdk_v2_2 components

3. **Resources Folder**
- Registers the AdotAwsSdkInstrumentationModule into OTel's SPI
extension classpath in META-INF/services
- Registers AdotTracingExecutionInterceptor into AWS SDK's interceptor
classpath in software.amazon.awssdk.global.handlers

### Key Design Decisions
1. **Instrumentation Ordering**
   - Deliberately structured to run after upstream OTel agent
   - Ensures all upstream modifications are captured
   - Maintains compatibility with existing instrumentation

2. **Lifecycle Hook Points**
   - `beforeTransmission`: Last point to access modified request
   - `modifyResponse`: Final opportunity to enrich span before closure
   - Carefully chosen to ensure complete attribute capture

### Testing
- Verified existing functionality remains unchanged and contract tests
pass (all contract tests pass after following the steps
[here](https://github.com/aws-observability/aws-otel-java-instrumentation/tree/main/appsignals-tests))
- Confirmed build success with new structure

### Benefits of using SPI
- Improved Maintainability: Clear separation between OTel core and
AWS-specific instrumentation
- Better Extensibility: Users can more easily extend or modify
AWS-specific behavior
- Reduced Risk: Eliminates manual patching during OTel upgrades
- Enhanced Compatibility: Better alignment with OpenTelemetry's
extension mechanisms
- Clearer Code Organization: More intuitive structure for future
contributions

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.
This PR is similar to aws-observability#1111, as it sets a base SPI implementation for
AWS SDK v1.11.

### Issue
This is the skeleton set up for the SPI, which aims to remove the
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)
for aws-sdk v1.11 by using OTel's InstrumentationModule SPI extension.
This instrumentation is essentially complementing the upstream java
agent. It is completely separate from upstream and instruments after the
Otel agent.

### Description of Changes
This PR sets up the foundational structure for AWS SDK v1.11
Instrumentation, moving away from the current patching approach. It
doesn't modify current ADOT functionality or the upstream span. It just
registers the ADOT SPI implementation and sets up the interceptor hooks.

#### Core Components

1. **AdotAwsSdkInstrumentationModule**
   - Extends OpenTelemetry's `InstrumentationModule` SPI
- Registers custom handler through AdotAwsSdkClientInstrumentation class
in `typeInstrumentations` method

2. **AdotAwsSdkClientInstrumentation**
- AdotAwsSdkClientAdvice registers our handler only if the upstream
aws-sdk span is enabled (i.e. it checks if the upstream handler is
present when an AWS SDK client is initialized).

3. **AdotAwsSdkTracingRequestHandler**
   - Extends AWS SDK's `RequestHandler2`
   - Hooks into key SDK lifecycle points:
- `beforeRequest`: Captures final SDK request after upstream
modifications
- `afterAttempt`: Processes response before span closure in upstream
   - Will be used to enriches spans
   - Acts as central coordinator for all the awssdk_v1_11 components

4. **Resources Folder**
- Registers the v1.11 AdotAwsSdkInstrumentationModule into OTel's SPI
extension classpath in META-INF/services

### Key Design Decisions
1. **Instrumentation Ordering**
   - Deliberately structured to run after upstream OTel agent
   - Ensures all upstream modifications are captured
   - Maintains compatibility with existing instrumentation

2. **Lifecycle Hook Points**
   - `beforeRequest`: Last point to access modified request
   - `afterAttempt`: Final opportunity to enrich span before closure

### Testing
- Verified existing functionality remains unchanged and contract tests
pass (all contract tests pass after following the steps
[here](https://github.com/aws-observability/aws-otel-java-instrumentation/tree/main/appsignals-tests))
- Confirmed build success with new structure

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.
Note: This is a continuation of aws-observability#1111

#### Description of Changes
This implementation builds on the foundation established in PR aws-observability#1111,
transforming the structural setup into a fully functional SPI-based
solution that will replace our current patching approach. This PR does
not change the current ADOT functionality because patches have not been
removed.

The next/final PR for v2.2 will remove the patches for aws-sdk-2.2 and
have unit tests to ensure correct SPI functionality and behaviour. The
final PR will also pass all the contract-tests once patches are removed.

#### Changes include:
- Migration of patched files into proper package structure:
NOTE: We are not copying entire files from upstream. Instead, we only
migrated the new components that were added by our patches and the
methods that use these AWS-specific components. I deliberately removed
any code that was untouched by our patches to avoid duplicating upstream
instrumentation code. This selective migration ensures we maintain only
our AWS-specific additions while letting OTel handle its base
functionality.
- `AwsExperimentalAttributes` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L2587)
creates new class
- `AwsSdkRequest` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L2673)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java)
- `AwsSdkRequestType` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L2751)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java)
- `BedrockJsonParser` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L2860)
creates new class
- `FieldMapper` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L3145)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/FieldMapper.java)
- `Serializer` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L3164)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/Serializer.java)
- `BedrockJsonParserTest` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L3474)
creates new class
- Setup of dependent files directly copied from upstream aws-sdk:
- `MethodHandleFactory` - copy-pasted from
[here](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/MethodHandleFactory.java)
- `FieldMapping` - copy-pasted from
[here](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/FieldMapping.java)
- `AwsJsonProtocolFactoryAccess` - copy-pasted from
[here](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsJsonProtocolFactoryAccess.java)

These added files:
- Access and modify span attributes
- Provide consistent formatting tools for span attributes
- Can be updated at our convenience if needed


The classes we copied from upstream are just helper utilities that make
it easier to inject span attributes during instrumentation. They're not
core functionality that needs to stay in sync with upstream changes,
rather standalone utilities that support our simpler, independent
instrumentation without creating version lock-in. They're independent of
OTel's core functionality, so we don't face the same version dependency
issues we had with patching. We're just following upstream's structure
for consistency.

#### OTel attribution for copied files
The 3 coped files have the OTel header included in them. This follows
section 4 a)-c) in the ADOT
[LICENSE](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/LICENSE#L89)

#### Testing
- Existing functionality verified
- Contract tests passing
- Build successful

#### Related
- Skeleton PR for aws-sdk v2.2:
aws-observability#1111
- Replaces patch: [current
patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Thomas Pierce <[email protected]>
Note: This is a continuation of
aws-observability#1115

### Description of Changes
This implementation builds on the foundation established in PR
aws-observability#1115,
transforming the structural setup into a fully functional SPI-based
solution that will replace our current patching approach. This PR does
not change the current ADOT functionality because patches have not been
removed.

The next/final PR for v1.11 will remove the patches for aws-sdk-1.11 and
have unit tests to ensure correct SPI functionality and behaviour. The
final PR will also pass all the contract-tests once patches are removed.

#### Changes include:
- Migration of patched files into proper package structure: 
NOTE: We are not copying entire files from upstream. Instead, we only
migrated the new components that were added by our patches and the
methods that use these AWS-specific components. I deliberately removed
any code that was untouched by our patches to avoid duplicating upstream
instrumentation code. This selective migration ensures we maintain only
our AWS-specific additions while letting OTel handle its base
functionality.
- `AwsBedrockResourceType` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L224)
creates new class
- `AwsExperimentalAttributes` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L362)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java)
- `AwsSdkExperimentalAttributesExtractor` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L408)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java)
- `BedrockJsonParser` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L655)
creates new class
- `RequestAccess` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L927)
on [this otel
file](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/release/v2.11.x/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java)
- `BedrockJsonParserTest` -
[patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch#L1461)
creates new class

These added files:

- Access and modify span attributes
- Provide consistent formatting tools for span attributes
- Can be updated at our convenience if needed

### Testing
- Existing functionality verified
- Contract tests passing
- Build successful

### Related
- Skeleton PR for aws-sdk v1.11:
aws-observability#1115
- Replaces patch: [current
patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Thomas Pierce <[email protected]>
…rvability#1120)

This is the final PR for the SPI aws-sdk instrumentation. It removes the
[opentelemetry-java-instrumentation](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)
patch and adds comprehensive unit test coverage for AWS experimental
attributes in both AWS SDK v1.11 and v2.2 instrumentation packages. The
v2.2 package introduces 29 new experimental attributes while v1.11 adds
23 new experimental attributes. All attributes are now tested through
unit tests and/or contract tests.

### Description of changes:

#### AWS SDK v2.2 (awssdk_v2_2)
New attributes being tested:
1. AWS_BUCKET_NAME - testS3ExperimentalAttributes() & contract tests
2. AWS_QUEUE_URL - testSqsExperimentalAttributes() & contract tests
3. AWS_QUEUE_NAME - contract tests
4. AWS_STREAM_NAME - testKinesisExperimentalAttributes() & contract
tests
5. AWS_STREAM_ARN - testKinesisExperimentalAttributes() & contract tests
6. AWS_TABLE_NAME - testDynamoDbExperimentalAttributes()
7. AWS_GUARDRAIL_ID - contract tests
8. AWS_GUARDRAIL_ARN - contract tests
9. AWS_AGENT_ID - testBedrockAgentExperimentalAttributes() & contract
tests
10. AWS_DATA_SOURCE_ID - testBedrockDataSourceExperimentalAttributes() &
contract tests
11. AWS_KNOWLEDGE_BASE_ID -
testBedrockKnowledgeBaseExperimentalAttributes() & contract tests
12. GEN_AI_MODEL - testBedrockExperimentalAttributes() & contract tests
13. GEN_AI_SYSTEM - contract tests
14. GEN_AI_REQUEST_MAX_TOKENS - testBedrockExperimentalAttributes() &
contract tests
15. GEN_AI_REQUEST_TEMPERATURE - testBedrockExperimentalAttributes() &
contract tests
16. GEN_AI_REQUEST_TOP_P - contract tests
17. GEN_AI_RESPONSE_FINISH_REASONS - contract tests
18. GEN_AI_USAGE_INPUT_TOKENS - contract tests
19. GEN_AI_USAGE_OUTPUT_TOKENS - contract tests
20. AWS_STATE_MACHINE_ARN - testStepFunctionExperimentalAttributes() &
contract tests
21. AWS_STEP_FUNCTIONS_ACTIVITY_ARN -
testStepFunctionExperimentalAttributes() & contract tests
22. AWS_SNS_TOPIC_ARN - testSnsExperimentalAttributes() & contract tests
23. AWS_SECRET_ARN - testSecretsManagerExperimentalAttributes() &
contract tests
24. AWS_LAMBDA_NAME - testLambdaExperimentalAttributes()
25. AWS_LAMBDA_ARN - testLambdaArnExperimentalAttribute()
26. AWS_LAMBDA_RESOURCE_ID - testLambdaResourceIdExperimentalAttribute()
27. AWS_TABLE_ARN - testTableArnExperimentalAttribute()
28. AWS_AUTH_ACCESS_KEY - testAuthAccessKeyExperimentalAttribute()
29. AWS_AUTH_REGION - testAuthRegionExperimentalAttribute()

- Tests leverage AWS SDK v2's getValueForField() API for clean, mockable
attribute extraction
- Includes comprehensive testing for:
- Core AWS services (S3, DynamoDB, SQS, SNS, Kinesis, Lambda, Step
Functions, Secrets Manager)
     - Bedrock Gen AI attributes with JSON parsing validation
     - Bedrock resource attributes (Agent, Knowledge Base, Data Source)
     - Authentication attributes (access key, region)

### AWS SDK v1.11 (awssdk_v1_11)
New attributes being tested:
1. AWS_STREAM_ARN - testKinesisExperimentalAttributes() & contract tests
2. AWS_TABLE_ARN - testTableArnExperimentalAttributes() (Service
identification only)
3. AWS_AGENT_ID - contract tests
4. AWS_KNOWLEDGE_BASE_ID - contract tests
5. AWS_DATA_SOURCE_ID - contract tests
6. AWS_GUARDRAIL_ID - testBedrockGuardrailAttributes() (Service
identification only) & contract tests
7. AWS_GUARDRAIL_ARN - testBedrockGuardrailAttributes() (Service
identification only) & contract tests
8. AWS_BEDROCK_RUNTIME_MODEL_ID - testBedrockRuntimeAttributes()
(Service identification only) & contract tests
9. AWS_BEDROCK_SYSTEM - contract tests
10. GEN_AI_REQUEST_MAX_TOKENS - contract tests
11. GEN_AI_REQUEST_TEMPERATURE - contract tests
12. GEN_AI_REQUEST_TOP_P - contract tests
13. GEN_AI_RESPONSE_FINISH_REASONS - contract tests
14. GEN_AI_USAGE_INPUT_TOKENS - contract tests
15. GEN_AI_USAGE_OUTPUT_TOKENS - contract tests
16. AWS_STATE_MACHINE_ARN - testStepFunctionsExperimentalAttributes() &
contract tests
17. AWS_STEP_FUNCTIONS_ACTIVITY_ARN - contract tests
18. AWS_SNS_TOPIC_ARN - testSnsExperimentalAttributes() & contract tests
19. AWS_SECRET_ARN - testSecretsManagerExperimentalAttributes() (Service
identification only) & contract tests
20. AWS_LAMBDA_NAME - testLambdaNameExperimentalAttributes()
21. AWS_LAMBDA_ARN - testLambdaArnExperimentalAttributes()
22. AWS_LAMBDA_RESOURCE_ID -
testLambdaResourceIdExperimentalAttributes() (Service identification
only)
23. AWS_AUTH_ACCESS_KEY - testAuthAccessKeyAttributes()

*V1.11 is harder to test:*

V1.11 uses Java reflection to dynamically find and call methods like
getFunctionName() on AWS request objects at runtime. This creates
several testing challenges:
- Mock Method Mismatch: When you mock an AWS request object, it doesn't
have the actual methods that reflection is trying to find. The
reflection silently fails and returns null, making tests pass even
though no attributes were extracted.
- Class Dependencies: To test properly, you'd need real AWS SDK classes
instead of mocks, creating tight coupling between tests and external
dependencies.
- Nested Object Complexity: Many attributes require traversing nested
properties, which means mocking entire object graphs with proper method
chains.

Contract tests sidestep these issues by using real AWS SDK objects
against LocalStack, testing the complete end-to-end flow including
actual reflection behavior without the complexity of mocking Java's
reflection system.

### Related
- PRs for aws-sdk v1.11: aws-observability#1115 and aws-observability#1117
- PRs for aws-sdk v2.2: aws-observability#1111 and aws-observability#1113
- Replaces patch: [current
patch](https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/.github/patches/opentelemetry-java-instrumentation.patch)

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.
# Conflicts:
#	.github/patches/opentelemetry-java-instrumentation.patch
#	dependencyManagement/build.gradle.kts
#	lambda-layer/patches/aws-otel-java-instrumentation.patch
#	lambda-layer/patches/opentelemetry-java-instrumentation.patch
@anahatAWS anahatAWS requested a review from a team as a code owner August 14, 2025 16:56
liustve
liustve previously approved these changes Aug 14, 2025
majanjua-amzn
majanjua-amzn previously approved these changes Aug 14, 2025
thpierce
thpierce previously approved these changes Aug 14, 2025
*Description of changes:*
Builds are failing image scanning for `CVE-2025-55163` which recently
was added as a vulnerability.
GHSA-prj3-ccx8-p6x4

Should revert this once we upgrade our aws-sdk dependency to version
that has this PR added:
aws/aws-sdk-java-v2#6344

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Thomas Pierce <[email protected]>
@anahatAWS anahatAWS dismissed stale reviews from thpierce, majanjua-amzn, and liustve via 529bebe August 14, 2025 22:35
@liustve liustve merged commit 8c8b717 into aws-observability:release/v2.11.x Aug 14, 2025
7 of 8 checks passed
lukeina2z pushed a commit to lukeina2z/aws-otel-java-instrumentation that referenced this pull request Sep 5, 2025
Updating patch for `v2.10.0` to `v2.11.0` bump.

Reference for how this patch was created:
yiyuan-he/opentelemetry-java-instrumentation#1

```
The following dependencies are using the latest release version:
 - com.sparkjava:spark-core:2.9.4
 - com.squareup.okhttp3:okhttp:4.12.0
 - io.opentelemetry:opentelemetry-extension-aws:1.20.1

The following dependencies have later release versions:
 - com.amazonaws:aws-java-sdk-bom [1.12.599 -> 1.12.783]
     https://aws.amazon.com/sdkforjava
 - com.fasterxml.jackson:jackson-bom [2.16.0 -> 2.19.0]
     https://github.com/FasterXML/jackson-bom
 - com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin [0.50.0 -> 0.52.0]
 - com.google.guava:guava-bom [33.0.0-jre -> 33.4.8-jre]
     https://github.com/google/guava
 - com.google.protobuf:protobuf-bom [3.25.1 -> 4.31.0]
     https://developers.google.com/protocol-buffers/
 - com.linecorp.armeria:armeria-bom [1.26.4 -> 1.32.5]
     https://armeria.dev/
 - commons-logging:commons-logging [1.2 -> 1.3.5]
     https://commons.apache.org/proper/commons-logging/
 - io.grpc:grpc-bom [1.59.1 -> 1.72.0]
     https://github.com/grpc/grpc-java
 - io.opentelemetry.contrib:opentelemetry-aws-resources [1.39.0-alpha -> 1.46.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.contrib:opentelemetry-aws-xray [1.39.0 -> 1.46.0]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha [2.11.0-adot1-alpha -> 2.16.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.javaagent:opentelemetry-javaagent [2.11.0-adot1 -> 2.16.0]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.proto:opentelemetry-proto [1.0.0-alpha -> 1.7.0-alpha]
     https://github.com/open-telemetry/opentelemetry-proto-java
 - net.bytebuddy:byte-buddy [1.14.10 -> 1.17.5]
     https://bytebuddy.net
 - org.apache.logging.log4j:log4j-bom [2.21.1 -> 2.24.3]
     https://logging.apache.org/log4j/2.x/
 - org.assertj:assertj-core [3.24.2 -> 3.27.3]
     https://assertj.github.io/doc/#assertj-core
 - org.curioswitch.curiostack:protobuf-jackson [2.2.0 -> 2.7.0]
     https://github.com/curioswitch/protobuf-jackson
 - org.junit:junit-bom [5.10.1 -> 5.12.2]
     https://junit.org/junit5/
 - org.slf4j:slf4j-api [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.slf4j:slf4j-simple [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.springframework.boot:spring-boot-dependencies [2.7.17 -> 3.5.0]
     https://spring.io/projects/spring-boot
 - org.testcontainers:testcontainers-bom [1.19.3 -> 1.21.0]
     https://java.testcontainers.org
 - software.amazon.awssdk:bom [2.21.33 -> 2.31.49]
     https://aws.amazon.com/sdkforjava

Gradle release-candidate updates:
 - Gradle: [8.10 -> 8.14.1]

```

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: ADOT Patch workflow <[email protected]>

Empty commit to trigger main build (aws-observability#1084)

Blank commit to trigger Java Agent Main Build with the latest commit
from our test framework repo.

```
git commit --allow-empty -m "Empty commit to trigger main build"
```

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

Release/v2.11.1 (aws-observability#1094)

*Description of changes:*

Merges changes from mainline to v2.11.1

Namely:
aws-observability#1085
and
aws-observability#1089

```
The following dependencies are using the latest release version:
 - com.sparkjava:spark-core:2.9.4
 - com.squareup.okhttp3:okhttp:4.12.0
 - io.opentelemetry:opentelemetry-extension-aws:1.20.1

The following dependencies have later release versions:
 - com.amazonaws:aws-java-sdk-bom [1.12.599 -> 1.12.785]
     https://aws.amazon.com/sdkforjava
 - com.fasterxml.jackson:jackson-bom [2.16.0 -> 2.19.0]
     https://github.com/FasterXML/jackson-bom
 - com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin [0.50.0 -> 0.52.0]
 - com.google.guava:guava-bom [33.0.0-jre -> 33.4.8-jre]
     https://github.com/google/guava
 - com.google.protobuf:protobuf-bom [3.25.1 -> 4.31.1]
     https://developers.google.com/protocol-buffers/
 - com.linecorp.armeria:armeria-bom [1.26.4 -> 1.32.5]
     https://armeria.dev/
 - commons-logging:commons-logging [1.2 -> 1.3.5]
     https://commons.apache.org/proper/commons-logging/
 - io.grpc:grpc-bom [1.59.1 -> 1.73.0]
     https://github.com/grpc/grpc-java
 - io.opentelemetry.contrib:opentelemetry-aws-resources [1.39.0-alpha -> 1.46.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.contrib:opentelemetry-aws-xray [1.39.0-adot1 -> 1.46.0]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha [2.11.0-adot2-alpha -> 2.16.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.javaagent:opentelemetry-javaagent [2.11.0-adot2 -> 2.16.0]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.proto:opentelemetry-proto [1.0.0-alpha -> 1.7.0-alpha]
     https://github.com/open-telemetry/opentelemetry-proto-java
 - net.bytebuddy:byte-buddy [1.14.10 -> 1.17.5]
     https://bytebuddy.net
 - org.apache.logging.log4j:log4j-bom [2.21.1 -> 2.24.3]
     https://logging.apache.org/log4j/2.x/
 - org.assertj:assertj-core [3.24.2 -> 3.27.3]
     https://assertj.github.io/doc/#assertj-core
 - org.curioswitch.curiostack:protobuf-jackson [2.2.0 -> 2.7.0]
     https://github.com/curioswitch/protobuf-jackson
 - org.junit:junit-bom [5.10.1 -> 5.13.0]
     https://junit.org/junit5/
 - org.slf4j:slf4j-api [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.slf4j:slf4j-simple [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.springframework.boot:spring-boot-dependencies [2.7.17 -> 3.5.0]
     https://spring.io/projects/spring-boot
 - org.testcontainers:testcontainers-bom [1.19.3 -> 1.21.1]
     https://java.testcontainers.org
 - software.amazon.awssdk:bom [2.21.33 -> 2.31.56]
     https://aws.amazon.com/sdkforjava

Gradle release-candidate updates:
 - Gradle: [8.10 -> 8.14.1]

```

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Jonathan Lee <[email protected]>
Co-authored-by: Thomas Pierce <[email protected]>
Co-authored-by: Michael He <[email protected]>
Co-authored-by: ADOT Patch workflow <[email protected]>
Co-authored-by: Prashant Srivastava <[email protected]>
Co-authored-by: Mohamed Asaker <[email protected]>

Update rust version (aws-observability#1097)

*Description of changes:*

Release build failed with:
<img width="1200" alt="image"
src="https://github.com/user-attachments/assets/3df092be-b9f3-4e62-9652-32cf4823d0ef"
/>

Updating rust version required for `edition2024`

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

[Lambda Java v2.11.x] Merge All Code Changes from v1.33.x Branch into v2.11.x (aws-observability#1114)

This change merges all private Lambda Java updates from the v1.33 branch
into the v2.11.x branch. I performed a 'git rebase v2.11' on the v1.33
branch, reviewed all changes, and completed the build and testing
process. The resulting Lambda layer generated trace data identical to
the version built directly from the v2.11.x branch (excluding this PR).

Here is the list of all migrated PRs:

Build layer during CI/CD workflows + some minor refactoring aws-observability#989

support java11 runtime for lambda aws-observability#1001

Unique artifact names for upload and merge for download aws-observability#1014

Bug fixes] Lambda - duplicate lambda spans + appsignals from unsampled
spans aws-observability#1000

Fix: Lambda Topology Issue (aws-observability#1016)

Fix: Lambda Topology Issue (aws-observability#1016) aws-observability#1085

feat: Support microservice span in Lambda Java environment. aws-observability#1053

Test
Tested Java11, 17, and 21 Lambda functions. Manually tested PR-1000 and
PR-1053. Both work as expected in the v2.11 branch. MicroService
(SpringBoot) support works well. I verified attribute
Trace.lambda.multiple server can be found in the Lambda server span,
once we have Servlet instrumentation enabled with
OTEL_INSTRUMENTATION_SERVLET_ENABLED.

Note: The changes in the patch files are not included in this PR. They
should have been reviewed and incorporated as part of this migration:

Upgrade Java Lambda Layer to 2.x aws-observability#1076

Lambda with SpringBoot MicroService:
<img width="1367" alt="lambda"
src="https://github.com/user-attachments/assets/5cf5be29-4986-454c-b61b-773d6cde3848"
/>

Service Map and added microservice attribute 'Trace.lambda.multiple
server'.
<img width="1864" alt="traceMap"
src="https://github.com/user-attachments/assets/f7ff1771-61f0-4013-b571-90370a726aa9"
/>

AppSignals
<img width="1875" alt="appSignals"
src="https://github.com/user-attachments/assets/24f1b3a8-851c-4c97-bb50-087ee275b86d"
/>

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

Release/v2.11.2 (aws-observability#1131)

*Description of changes:*
Cherry-picked commits from the mainline to my branch release/v2.11.2

438802b Send main build metrics (aws-observability#1127)
f9b24f2 [AppSignal E2E Testing] Validate E2E Tests Are Accounted For
(aws-observability#1126)
d672f84 Fix Otlp Aws exporters failures for GZIP compressed telemetry
exports (aws-observability#1124)
0be84b6 AWS SDK v1.11 Patch Migration (aws-observability#1117)
2c3ef71 AWS SDK v2.2 SPI Patch Migration (aws-observability#1113)
dac0fd8 Sigv4 - Add Missing STS Dependency (aws-observability#1101)
ce91366 fix compatibility issue with java v8 (aws-observability#1118)
691c970 Base of AWS SDK v1.11 SPI Implementation (aws-observability#1115 )
f425675 Base of AWS SDK v2.2 SPI Implementation (aws-observability#1111)
a41c7f3 feat: Extract account/access key id and region for cross-account
support (aws-observability#1081)
e524eda update local operation of lambda span based on span attribute
(aws-observability#1106)
43198cf Add lambda layer default region (aws-observability#1104)
fe2ec3a Add YYC, BKK, KUL, QRO, ZHY, BJS to the lambda layer release
workflow (aws-observability#1103)
542b209 Update Sonatype publishing URL to Central Portal (aws-observability#1090)
31e4de1 Release safety (aws-observability#1096)
e45a0ab Update image scan to point to 2.11.1 release (aws-observability#1099)

Also bumped the adot2 to adot3 as we are doing all of this under Java
SDK 2.11.2 patch release.

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Jeel Mehta <[email protected]>
Co-authored-by: Steve Liu <[email protected]>
Co-authored-by: Prashant Srivastava <[email protected]>
Co-authored-by: Harry <[email protected]>
Co-authored-by: Ping Xiang <[email protected]>
Co-authored-by: Blair Huang <[email protected]>
Co-authored-by: Anahat <[email protected]>
Co-authored-by: Thomas Pierce <[email protected]>
Co-authored-by: Jonathan Lee <[email protected]>
Co-authored-by: Eric Zhang <[email protected]>

Revert "Release/v2.11.2 (aws-observability#1131)"

This reverts commit 4f5704f.

Release/v2.11.2 v2 (aws-observability#1133)

Description of changes:
Cherry-picked commits from the mainline to my branch release/v2.11.2

Release/v2.11.3 (aws-observability#1146)

*Description of changes:*

Merges changes from mainline to v2.11.3
Namely: aws-observability#1111 aws-observability#1115 aws-observability#1113 aws-observability#1117 and aws-observability#1120

Steps followed:

1. Fork `aws-otel-java-instrumentation` repo
2. Checkout `release/2.11.x`
3. Create branch `release/2.11.3` based off `release/2.11.x` (`git
checkout -b release/2.11.3`)
4. `git cherry-pick 572215e ac3c0c7 9a76dda 8a3b772 25b2cd8`
5. Resolved merge conflict for 25b2cd8
6. run `./gradlew dependencyUpdates`
7. Create PR

```
The following dependencies are using the latest release version:
 - com.sparkjava:spark-core:2.9.4
 - io.opentelemetry:opentelemetry-extension-aws:1.20.1

The following dependencies have later release versions:
 - com.amazonaws:aws-java-sdk-bom [1.12.599 -> 1.12.788]
     https://aws.amazon.com/sdkforjava
 - com.fasterxml.jackson:jackson-bom [2.16.0 -> 2.19.2]
     https://github.com/FasterXML/jackson-bom
 - com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin [0.50.0 -> 0.52.0]
 - com.google.guava:guava-bom [33.0.0-jre -> 33.4.8-jre]
     https://github.com/google/guava
 - com.google.protobuf:protobuf-bom [3.25.1 -> 4.31.1]
     https://developers.google.com/protocol-buffers/
 - com.linecorp.armeria:armeria-bom [1.26.4 -> 1.33.1]
     https://armeria.dev/
 - com.squareup.okhttp3:okhttp [4.12.0 -> 5.1.0]
     https://square.github.io/okhttp/
 - commons-logging:commons-logging [1.2 -> 1.3.5]
     https://commons.apache.org/proper/commons-logging/
 - io.grpc:grpc-bom [1.59.1 -> 1.74.0]
     https://github.com/grpc/grpc-java
 - io.opentelemetry.contrib:opentelemetry-aws-resources [1.39.0-alpha -> 1.48.0-alpha]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.contrib:opentelemetry-aws-xray [1.39.0-adot1 -> 1.48.0]
     https://github.com/open-telemetry/opentelemetry-java-contrib
 - io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha [2.11.0-alpha -> 2.18.1-alpha]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.javaagent:opentelemetry-javaagent [2.11.0 -> 2.18.1]
     https://github.com/open-telemetry/opentelemetry-java-instrumentation
 - io.opentelemetry.proto:opentelemetry-proto [1.0.0-alpha -> 1.7.0-alpha]
     https://github.com/open-telemetry/opentelemetry-proto-java
 - net.bytebuddy:byte-buddy [1.14.10 -> 1.17.6]
     https://bytebuddy.net
 - org.apache.logging.log4j:log4j-bom [2.21.1 -> 2.25.1]
     https://logging.apache.org/log4j/2.x/
 - org.assertj:assertj-core [3.24.2 -> 3.27.4]
     https://assertj.github.io/doc/#assertj-core
 - org.curioswitch.curiostack:protobuf-jackson [2.2.0 -> 2.8.1]
     https://github.com/curioswitch/protobuf-jackson
 - org.junit:junit-bom [5.10.1 -> 5.13.4]
     https://junit.org/
 - org.slf4j:slf4j-api [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.slf4j:slf4j-simple [1.7.36 -> 2.0.17]
     http://www.slf4j.org
 - org.springframework.boot:spring-boot-dependencies [2.7.17 -> 3.5.4]
     https://spring.io/projects/spring-boot
 - org.testcontainers:testcontainers-bom [1.19.3 -> 1.21.3]
     https://java.testcontainers.org
 - software.amazon.awssdk:bom [2.30.17 -> 2.32.22]
     https://aws.amazon.com/sdkforjava

Gradle release-candidate updates:
 - Gradle: [8.10 -> 9.0.0 -> 9.1.0-rc-1]
```

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 license.

---------

Co-authored-by: Thomas Pierce <[email protected]>
Co-authored-by: Steve Liu <[email protected]>

AWS X-Ray Adaptive Sampling Support (aws-observability#1141)

Propagate sampling decision as attribute (aws-observability#1161)

Shorten trace state usage for adaptive sampling (aws-observability#1164)

[Adaptive Sampling] Improve trace capturing and counting using cache

Fix disk-buffering build failure in contrib (aws-observability#1169)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants